package com.gitee.exception;

import com.gitee.base.Result;
import com.gitee.constants.ResponseKey;
import com.gitee.enums.HttpCode;
import com.gitee.utils.StringUtils;

/**
 * <h5>异常基类</h5>
 * 异常信息:主要根据exception的message获取<br>
 * 若message为空或者空串时，则根据HttpCode的msg<br>
 * 配置文件为国际化的配置文件<br>
 * <code>HttpCode</code>
 * @author  赵炎
 * @version  [V1.00, 2019年1月24日]
 * @since V1.00
 */
public abstract class BaseException extends RuntimeException
{

    /**
     * serialVersionUID
     */
    private static final long serialVersionUID = 7159077014527223749L;

    public BaseException()
    {
    }
    
    public BaseException(Throwable ex)
    {
        super(ex);
    }
    
    public BaseException(String message)
    {
        super(message);
    }
    
    public BaseException(String message, Throwable ex)
    {
        super(message, ex);
    }
    
    /** 
     * 异常处理
     * @param result 封装的结果对象
     */
    public void handler(Result result)
    {
        result.put(ResponseKey.CODE,  getHttpCode().code());
        // 如果自定义的异常有自定义的异常信息返回异常信息 否则根据配置文件中的内容取值
        if(StringUtils.isNotBlank(getMessage()))
        {
            result.put(ResponseKey.MESSAGE, getMessage());
        } 
        else
        {
            // 默认获取配置文件中的异常信息
            result.put(ResponseKey.MESSAGE, getHttpCode().msg());
        }
        result.put(ResponseKey.TIMESTAMP,  System.currentTimeMillis());
    }
    
    /** 
     * Http 状态码
     */
    protected abstract HttpCode getHttpCode();
}
